# -*- coding: utf-8 -*-
# @Author  : longbhu
# @Time    : 2025/3/26 10:47
# @Function:
from typing import Any
import pandas as pd
import os
import rasterio
import numpy as np
from tqdm import tqdm

# 行政编码到中文名的映射
admin_code_to_name_default = {
    "110000": "北京市",
    "120000": "天津市",
    "130000": "河北省",
    "140000": "山西省",
    "150000": "内蒙古自治区",
    "210000": "辽宁省",
    "220000": "吉林省",
    "230000": "黑龙江省",
    "310000": "上海市",
    "320000": "江苏省",
    "330000": "浙江省",
    "340000": "安徽省",
    "350000": "福建省",
    "360000": "江西省",
    "370000": "山东省",
    "410000": "河南省",
    "420000": "湖北省",
    "430000": "湖南省",
    "440000": "广东省",
    "450000": "广西壮族自治区",
    "460000": "海南省",
    "500000": "重庆市",
    "510000": "四川省",
    "520000": "贵州省",
    "530000": "云南省",
    "540000": "西藏自治区",
    "610000": "陕西省",
    "620000": "甘肃省",
    "630000": "青海省",
    "640000": "宁夏回族自治区",
    "650000": "新疆维吾尔自治区",
    "660000": "新疆建设兵团",
}


# 创建一个字典，将缩写映射到相应的治理成本列名  key是行政区划代码后的字段 也就是调节服务项的公式名 ；value 价格表的列名

wp_cost_type_mapping = {
    'QwpCOD': 'COD治理成本（元/吨）',
    'QwpTN': '总氮治理成本（元/吨）',
    'QwpTP': '总磷治理成本（元/吨）'
}
ap_cost_type_mapping = {
    'QapPM': '烟粉尘治理成本（元/吨）',
    'QapNOx': '氮氧化物治理成本（元/吨）',
    'QapSO2': '二氧化硫治理成本（元/吨）'
}

ett_cost_type_mapping = {
    'Ept': '当地生活消费电价（元/kW·h）',
    'Ewe': '当地生活消费电价（元/kW·h）'
}

tco2_cost_type_mapping = {
    'Qtco2': '二氧化碳价格（元/t）',
}

def get_excel_value_by_key(excel_path: str, key_column:str,key: int, value_column: str) -> Any | None:
    """
    通过指定的键（列名1的值）来获取另一列（列名2）的值。

    :param excel_path: Excel文件的路径
    :param key: 指定列的值
    :param key_column: 指定列的列名
    :param value_column: 要获取值的列名
    :return: 二氧化硫治理成本，如果未找到则返回None
    """
    try:
        # 读取Excel文件
        df = pd.read_excel(excel_path)

        # 查找对应行政区划代码的行
        result = df[df[key_column] == key]
        print(result)

        if not result.empty:
            # 返回二氧化硫治理成本
            return result[value_column].values[0]
        else:
            # 如果未找到对应行政区划代码，返回None
            return None
    except Exception as e:
        print(f"发生错误: {e}")
        return None

# 示例用法
# excel_path = r'F:\code\dev\calc-gep-regulate-cqc\补丁\AP价格表.xlsx'
# admin_code = 110000  # 替换为您要查询的行政区划代码
# column_name = '二氧化硫治理成本'  # 替换为您要查询的列名
# cost = get_excel_value_by_key(excel_path, '行政区划代码', admin_code, column_name)
# print(cost)


def analyze_tif_files(folder_path: str, excel_path:str, cost_type_mapping: dict[str, str],admin_code_to_name=None, output_path: str = None) -> None:
    """
    分析指定文件夹中的 TIF 文件，并将结果保存到 Excel 文件中。根据tif文件名的信息，制作列名。

    :param folder_path: 包含 TIF 文件的文件夹路径
    :param admin_code_to_name: 行政编码到中文名的映射字典
    :param output_path: 结果保存的 Excel 文件路径，默认为 None，将根据 folder_path 生成
    """
    # 初始化一个空的DataFrame来存储结果
    if admin_code_to_name is None:
        admin_code_to_name = admin_code_to_name_default
    # 定义列名
    columns = ['行政区划代码', '核算地区','面积（km2）', '调节服务项', '生态系统', '实物量总值（t）', '实物量地均值（t/km2）',  '价格（元/t）','价值量总值（元）', '价值量地均值（元/km2）']
    results = pd.DataFrame(columns=columns)

    # 遍历文件夹中的所有文件
    for filename in tqdm(os.listdir(folder_path), desc="Processing TIF files"):
        if filename.endswith('.tif'):
            # 提取行政编码
            admin_code = int(filename.split('_')[0])

            # 提取实物量类型和生态系统类型
            quantity_type = filename.split('_')[1]
            ecosystem_type = filename.split('_')[2]

            # 打开TIF文件
            with rasterio.open(os.path.join(folder_path, filename)) as src:
                # 读取所有波段的数据
                data = src.read(1)

                # 计算总值和平均值
                Q_total_value = np.nansum(data)  # 忽略NaN值
                Q_mean_value = np.nanmean(data) / 0.0009  # 忽略NaN值       实物量地均值（t/km2）

                # 使用np.sum()来计算非NaN元素的个数
                area = np.sum(np.logical_not(np.isnan(data))) * 0.0009 # 面积（km2）
                self_mean_value = Q_total_value/area
                # print(f"np输出的实物量地均值{Q_mean_value}与计算的实物量地均值{self_mean_value}")

                # 该地区的实物量乘以该地区的价格得到价值量 ,根据admin_code提取价格
                V_cost = get_excel_value_by_key(excel_path, '行政区划代码', admin_code, cost_type_mapping.get(quantity_type))
                print(f"该地区的{quantity_type}-{cost_type_mapping.get(quantity_type)}为{V_cost}")

                V_total_value = Q_total_value * V_cost
                V_mean_value = V_total_value / area  #    实物量地均值（t/km2）


                # 将结果添加到DataFrame
                new_row = pd.DataFrame({
                    columns[0]: [admin_code],   # 行政编码
                    columns[1]: [admin_code_to_name.get(str(admin_code), '未知地区')], # 核算地区
                    columns[2]: [area],    # 面积（km2）

                    columns[3]: [quantity_type],  # 调节服务项
                    columns[4]: [ecosystem_type], # 生态系统
                    columns[5]: [Q_total_value], # 实物量总值（t）
                    columns[6]: [Q_mean_value],   # 实物量地均值（t/km2）

                    columns[7]: [V_cost],  # 价格（元/t）
                    columns[8]: [V_total_value], # 价值量总值（元）
                    columns[9]: [V_mean_value]    # 价值量地均值（元/km2）
                })
                results = pd.concat([results, new_row], ignore_index=True)

    # 根据 folder_path 生成默认的 output_path
    if output_path is None:
        folder_name = os.path.basename(folder_path)
        parent_folder_path = os.path.dirname(folder_path) # 获取上级文件夹路径
        output_path = os.path.join(parent_folder_path, rf'{folder_name}_results.xlsx')

    # 将结果存储到Excel文件
    # results.to_excel(output_path, index=False)
    # 将DataFrame写入Excel文件
    with pd.ExcelWriter(output_path, engine='openpyxl') as writer:
        results.to_excel(writer, index=False, sheet_name='Sheet1')

        # 获取工作簿和工作表
        workbook = writer.book
        worksheet = writer.sheets['Sheet1']

        # 设置价格1列的单元格格式为货币
        for cell in worksheet['H']:
            cell.number_format = '¥#,##0.00'
        # 设置价格1列的单元格格式为货币
        for cell in worksheet['I']:
            cell.number_format = '¥#,##0.00'
        # 设置价格1列的单元格格式为货币
        for cell in worksheet['J']:
            cell.number_format = '¥#,##0.00'

        # 设置最适应列宽
        for column in worksheet.columns:
            max_length = 0
            column = list(column)
            for cell in column:
                try:  # 需要处理cell.value为None的情况
                    if len(str(cell.value)) > max_length:
                        max_length = len(cell.value)
                except:
                    pass
            adjusted_width = (max_length + 2) * 2
            from openpyxl.utils import get_column_letter
            worksheet.column_dimensions[get_column_letter(column[0].column)].width = adjusted_width

    print(f'结果已保存到 {output_path}')

# wp_tif_folder_path = r'H:/GEP_result/2023/Qwp'
# excel_path = r'F:\code\dev\calc-gep-regulate-cqc\补丁\WP价格表.xlsx'
# # 创建一个字典，将缩写映射到相应的治理成本列名
# wp_cost_type_mapping = {
#     'QwpCOD': 'COD治理成本',
#     'QwpTN': '总氮治理成本',
#     'QwpTP': '总磷治理成本'
# }
# analyze_tif_files(wp_tif_folder_path, cost_type_mapping = wp_cost_type_mapping, excel_path = excel_path)